// Copyright 2010, Vanya Davidenko.
// Используемая кодировка: UTF-8.

#ifndef SCRW_ICU_INIT_H_
#define SCRW_ICU_INIT_H_

#include <libv/check.h>
#include <libv/uncopyable.h>

#include <unicode/putil.h>
#include <unicode/uclean.h>

// Если не определен макрос — определяем, а после include возвращаем как было.
#ifndef LOKI_CLASS_LEVEL_THREADING
# define LOKI_CLASS_LEVEL_THREADING
# define UNDEF_LOKI_CLASS_LEVEL_THREADING
#endif
#include <loki/Threads.h>
#include <loki/Singleton.h>
#ifdef UNDEF_LOKI_CLASS_LEVEL_THREADING
# undef LOKI_CLASS_LEVEL_THREADING
# undef UNDEF_LOKI_CLASS_LEVEL_THREADING
#endif


namespace scrw
{

/** RAII-объект, инициализирующий ICU в конструкторе и очищающий в деструкторе.
  * Так как создавать объект нужно один раз, рекомендуется использование
  * класса-одиночки (синглтона) TheICUInitializationAndCleanUp, в таком
  * случае первый вызов TheICUInitializationAndCleanUp::Instance() проведет
  * инициализацию, а последующие будут проигнорированы. */
class IcuInitializationAndCleanUp : libv::Uncopyable
{
  public:
    IcuInitializationAndCleanUp()
    {
        UErrorCode err = U_ZERO_ERROR;
        // u_setDataDirectory("../Debug");  // пока не используется
        u_init(&err);
        VERIFY(U_SUCCESS(err) == TRUE);
    }

    ~IcuInitializationAndCleanUp()
    {
        u_cleanup();
    }
};

typedef Loki::SingletonHolder<
    IcuInitializationAndCleanUp,
    Loki::CreateUsingNew,
    Loki::DefaultLifetime,
    Loki::ClassLevelLockable> TheICUInitializationAndCleanUp;


}

#endif  // SCRW_ICU_INIT_H_
